﻿// See https://aka.ms/new-console-template for more information
using System;
using System.Collections;
//单元测试   依赖反转
//namespace shh
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            //Fan fan = new Fan(new PowerSupply());
//            //Console.WriteLine(fan.Work());
//        }
//    }

//    public interface IPower
//    {
//        int GetPower();
//    }
//    //紧耦合,测试的时候需要不断修改类里面的值,万一这个电源也和其他类紧耦合,修改电源值会出现很大问题
//    public class PowerSupply: IPower
//    {
//        public int GetPower()
//        {
//            return 220;
//        }
//    }

//    public class Fan : PowerSupply
//    {
//        public IPower _power;
//        public Fan(IPower power)
//        {
//            _power = power;
//        }

//        public string Work()
//        {
//            int pow = _power.GetPower();
//            if (pow <= 0) return "Won't work";
//            else if (pow <= 220) return "Work fine";
//            else return "Worning!!!";
//        }
//    }
//}

//接口有效降低耦合度,人与手机解耦
//namespace shh
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Users Danel = new Users(new Nokia());
//            Danel.Work();
//        }
//    }

//    class Users
//    {
//        //类里面声明可以接口的字段,相当于泛化了,不再确切地指定特定内容(如某一款特定的手机)
//        private IPhone _phone;  
//        public Users(IPhone phone)
//        {
//            _phone = phone;
//        }

//        public void Work()
//        {
//            _phone.Send();
//            _phone.Dial();
//            _phone.PickUp();
//            _phone.Receive();
//        }
//    }

//    interface IPhone
//    {
//        void Send();
//        void Dial();
//        void PickUp();
//        void Receive();
//    }

//    class Nokia : IPhone
//    {
//        public void Send()
//        {
//            Console.WriteLine("Nokia sending...");
//        }
//        public void Dial()
//        {
//            Console.WriteLine("Nokia Dailing...");
//        }
//        public void PickUp()
//        {
//            Console.WriteLine("Nokia PickUp");
//        }
//        public void Receive()
//        {
//            Console.WriteLine("Receiving");
//        }
//    }

//    class Huawei : IPhone
//    {
//        public void Send()
//        {
//            Console.WriteLine("Huawei sending...");
//        }
//        public void Dial()
//        {
//            Console.WriteLine("Huawei Dailing...");
//        }
//        public void PickUp()
//        {
//            Console.WriteLine("Huawei PickUp");
//        }
//        public void Receive()
//        {
//            Console.WriteLine("Receiving");
//        }
//    }
//}

//紧耦合的弊端
//namespace shh
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Engine engine = new Engine();
//            Car car = new Car(engine);
//            car.Run(3);
//            Console.WriteLine(car.speed);
//        }
//    }
//    //引擎和汽车高度耦合,引擎出现一点问题,就算汽车类本身的实现没问题也会报错
//    class Engine
//    {
//        public int RPM { get; private set; }
//        public void Work(int gas)
//        {
//            //RPM = gas*1000;
//            RPM = 0;
//        }
//    }
//    class Car
//    {
//        private Engine _engine;
//        public Car(Engine engine)
//        {
//            _engine = engine;
//        }
//        public int speed { get; private set; }
//        public void Run(int gas)
//        {
//            _engine.Work(gas);
//            speed = _engine.RPM / 100;
//        }
//    }
//}

//接口:契约
//namespace shh
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int[] num1 = new int[] { 1, 2, 3 };
//            ArrayList num2 = new ArrayList() { 1, 2, 3 }; //非泛型集合,元素都被视为object
//            Console.WriteLine(Sum(num1));
//            Console.WriteLine(Avg(num1));
//            Console.WriteLine(Sum(num2));
//            Console.WriteLine(Avg(num2));

//        }
//        //不采用泛型编程的话,得写两份.但是接口IEnumerable相当于应该契约,确认供方(Main)提供的是课迭代的
//        static int Sum(IEnumerable nums)
//        {
//            int ret = 0;
//            foreach (var num in nums) ret += (int)num;
//            return ret;
//        }

//        static double Avg(IEnumerable nums)
//        {
//            double ret = 0;
//            int cnt = 0;
//            foreach (var num in nums)
//            {
//                ret += (int)num;
//                cnt++;
//            }
//            return ret / cnt;
//        }
//    }
//}